package com.train.order.mapper;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.train.common.model.page.PageSorted;
import com.train.common.resp.PageResp;
import com.train.mybatis.base.MyBaseMapper;
import com.train.order.bo.ConfirmOrderTicketBO;
import com.train.order.dto.confirm.ConfirmOrderEditStatusDTO;
import com.train.order.dto.confirm.ConfirmOrderPageDTO;
import com.train.order.dto.confirm.ConfirmOrderPageHandleOrderDTO;
import com.train.order.dto.confirm.ConfirmOrderQueryDTO;
import com.train.order.enums.impl.ConfirmOrderStatusEnums;
import com.train.order.po.ConfirmOrderPO;
import com.train.order.resp.ConfirmOrderPageResp;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author baitiaojun
 * @description 针对表【confirmOrder(确认订单)】的数据库操作Mapper
 * @createDate 2025-03-11 21:07:57
 * @Entity generator.domain.ConfirmOrder
 */
public interface ConfirmOrderMapper extends MyBaseMapper<ConfirmOrderPO> {

    default PageResp<ConfirmOrderPageResp> pageList(ConfirmOrderPageDTO confirmOrderPageDTO) {
        PageResp<ConfirmOrderPO> confirmOrderPOPageResp = this.selectPage(
                confirmOrderPageDTO,
                new LambdaQueryWrapper<>(), new PageSorted(ConfirmOrderPO::getUpdateTime), new PageSorted(ConfirmOrderPO::getCreateTime));
        List<ConfirmOrderPageResp> confirmOrderPageRespList = BeanUtil.copyToList(confirmOrderPOPageResp.getData(), ConfirmOrderPageResp.class);
        return new PageResp<>(confirmOrderPOPageResp.getTotal(), confirmOrderPageRespList);
    }

    default PageResp<ConfirmOrderPageHandleOrderDTO> pageListByTrainDateStaus(ConfirmOrderPageDTO confirmOrderPageDTO) {
        LambdaQueryWrapper<ConfirmOrderPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper
                .select(ConfirmOrderPO::getId, ConfirmOrderPO::getMemberId, ConfirmOrderPO::getTickets,
                        ConfirmOrderPO::getStart, ConfirmOrderPO::getEnd)
                .eq(ConfirmOrderPO::getDate, confirmOrderPageDTO.getDate())
                .eq(ConfirmOrderPO::getTrainCode, confirmOrderPageDTO.getTrainCode())
                .eq(ConfirmOrderPO::getStatus, confirmOrderPageDTO.getStatus());
        PageResp<ConfirmOrderPO> confirmOrderPOPageResp = this.selectPage(confirmOrderPageDTO, queryWrapper);
        List<ConfirmOrderPageHandleOrderDTO> handleOrderDTOList
                = BeanUtil.copyToList(confirmOrderPOPageResp.getData(), ConfirmOrderPageHandleOrderDTO.class);
        return new PageResp<>(confirmOrderPOPageResp.getTotal(), handleOrderDTOList);
    }

    default Long saveConfirmOrder(ConfirmOrderTicketBO bo) {
        ConfirmOrderPO confirmOrderPO = BeanUtil.copyProperties(bo, ConfirmOrderPO.class);
        if (this.insert(confirmOrderPO) == 0) {
            return null;
        }
        return confirmOrderPO.getId();
    }

    default boolean updateConfirmOrder(Long id, String status) {
        LambdaUpdateWrapper<ConfirmOrderPO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(ConfirmOrderPO::getStatus, status).eq(ConfirmOrderPO::getId, id);
        return this.update(updateWrapper) > 0;
    }

    default Long getConfirmOrder(ConfirmOrderQueryDTO queryDTO) {
        ConfirmOrderPO confirmOrderPO = this.selectOne(new LambdaQueryWrapper<ConfirmOrderPO>()
                .select(ConfirmOrderPO::getId)
                .eq(ConfirmOrderPO::getMemberId, queryDTO.getMemberId())
                .eq(ConfirmOrderPO::getTrainCode, queryDTO.getTrainCode())
                .eq(ConfirmOrderPO::getDate, queryDTO.getDate())
                .eq(StrUtil.isNotEmpty(queryDTO.getStatus()), ConfirmOrderPO::getStatus, queryDTO.getStatus()));
        return confirmOrderPO == null ? null : confirmOrderPO.getId();
    }

    default boolean editOrderStatus(ConfirmOrderEditStatusDTO statusDTO) {
        LambdaUpdateWrapper<ConfirmOrderPO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(ConfirmOrderPO::getStatus, statusDTO.getStatus())
                .eq(ConfirmOrderPO::getId, statusDTO.getId());
        return this.update(updateWrapper) > 0;
    }

    default Long countNumber(ConfirmOrderPO confirmOrderPO) {
        LambdaQueryWrapper<ConfirmOrderPO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ConfirmOrderPO::getDate, confirmOrderPO.getDate())
                .eq(ConfirmOrderPO::getTrainCode, confirmOrderPO.getTrainCode())
                .lt(ConfirmOrderPO::getCreateTime, confirmOrderPO.getCreateTime())
                .and(wrapper -> wrapper.eq(ConfirmOrderPO::getStatus, ConfirmOrderStatusEnums.INIT.getCode())
                        .or(wrapper1 -> wrapper1.eq(ConfirmOrderPO::getStatus, ConfirmOrderStatusEnums.PENDING.getCode())));
        return this.selectCount(queryWrapper);
    }

    default boolean editInitOrderStatus(ConfirmOrderEditStatusDTO statusDTO) {
        LambdaUpdateWrapper<ConfirmOrderPO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.set(ConfirmOrderPO::getStatus, statusDTO.getStatus())
                .eq(ConfirmOrderPO::getId, statusDTO.getId())
                .eq(ConfirmOrderPO::getStatus, ConfirmOrderStatusEnums.INIT.getCode());
        return this.update(updateWrapper) > 0;
    }
}